Environment Setup

Install R

Install R from here: https://cran.r-project.org/.

Install R Studio Desktop

Install R Studio Desktop from here: https://www.rstudio.com/products/rstudio/download/#download.

Install Required Libraries

install.packages("readxl")
install.packages("fitdistrplus")
install.packages("stats")
install.packages("actuar")
install.packages("vtable")
install.packages("data.table")
install.packages("dplyr")
install.packages("vioplot")
install.packages("bupaR")
install.packages("processanimateR")

Load Required Libraries

library(readxl)
library(fitdistrplus)
library(stats)
library(actuar)
library(vtable)
library(data.table)
library(dplyr)
library(vioplot)
library(bupaR)
library(processanimateR)

Dataset Preparation

Loading the Dataset

This filename should match your data location. The log file should have at least the columns named Case ID, Activity, Start Time, End Time.

dataset <- read_excel("C:/Users/Usuario/Desktop/Pastas/Escola/Universidade/Mestrado/1º Semestre/Modelação e Implementação de Processos/Trabalho Grupo/2ª Parte/G17.xlsx")
#colnames(dataset)[which(names(dataset) == "case")] <- "Case ID"
#colnames(dataset)[which(names(dataset) == "event")] <- "Activity"
#colnames(dataset)[which(names(dataset) == "resource")] <- "Resource"
colnames(dataset)[which(names(dataset) == "Start Timestamp")] <- "Start Time"
colnames(dataset)[which(names(dataset) == "Complete Timestamp")] <- "End Time"

Formatting Date/Time columns

The Start Time and End Time columns should be formatted accordingly with the proper Date/Time mask present in the log file.

dataset[['Start Time']] <- as.POSIXct(dataset$`Start Time`, format = "%Y-%m-%d %H:%M:%S")
dataset[['End Time']] <- as.POSIXct(dataset$`End Time`, format = "%Y-%m-%d %H:%M:%S")

Viewing the Dataset

dataset
## # A tibble: 6,216 x 6
##    `Case ID` Activity    `Start Time`        `End Time`          Resource  Role 
##        <dbl> <chr>       <dttm>              <dttm>              <chr>     <chr>
##  1         1 Create Pur~ 2010-12-31 23:00:00 2010-12-31 23:37:00 Kim Passa Requ~
##  2         1 Create Req~ 2011-01-01 04:37:00 2011-01-01 04:45:00 Kim Passa Requ~
##  3         1 Analyze Re~ 2011-01-01 05:41:00 2011-01-01 05:55:00 Karel de~ Purc~
##  4         1 Send Reque~ 2011-01-01 10:43:00 2011-01-01 11:09:00 Karel de~ Purc~
##  5         1 Create Quo~ 2011-01-01 11:32:00 2011-01-01 15:03:00 Magdalen~ Purc~
##  6         1 Analyze Qu~ 2011-01-01 21:44:00 2011-01-01 22:13:00 Immanuel~ Requ~
##  7         1 Choose bes~ 2011-01-01 22:13:00 2011-01-01 22:13:00 Tesca Lo~ Requ~
##  8         1 Settle con~ 2011-01-02 00:22:00 2011-01-02 08:20:00 Francois~ Purc~
##  9         1 Create Pur~ 2011-01-02 08:58:00 2011-01-02 09:10:00 Karel de~ Purc~
## 10         1 Confirm Pu~ 2011-01-02 13:09:00 2011-01-02 13:43:00 Sean Man~ Supp~
## # ... with 6,206 more rows

Filtering Only First Event of Each Case/Instance

#This is needed to compute the arrival time between instances/cases
filtered <- dataset[!duplicated(dataset$`Case ID`),] 
filtered
## # A tibble: 405 x 6
##    `Case ID` Activity    `Start Time`        `End Time`          Resource  Role 
##        <dbl> <chr>       <dttm>              <dttm>              <chr>     <chr>
##  1         1 Create Pur~ 2010-12-31 23:00:00 2010-12-31 23:37:00 Kim Passa Requ~
##  2         4 Create Pur~ 2011-01-01 07:39:00 2011-01-01 08:00:00 Fjodor K~ Requ~
##  3         5 Create Pur~ 2011-01-01 08:49:00 2011-01-01 09:35:00 Esmana L~ Requ~
##  4         7 Create Pur~ 2011-01-01 13:05:00 2011-01-01 14:00:00 Esmana L~ Requ~
##  5         8 Create Pur~ 2011-01-01 13:27:00 2011-01-01 14:17:00 Fjodor K~ Requ~
##  6        10 Create Pur~ 2011-01-02 01:52:00 2011-01-02 02:43:00 Esmana L~ Requ~
##  7        12 Create Pur~ 2011-01-02 04:31:00 2011-01-02 04:41:00 Alberto ~ Requ~
##  8        13 Create Pur~ 2011-01-02 06:47:00 2011-01-02 07:06:00 Anna Kau~ Requ~
##  9        16 Create Pur~ 2011-01-02 18:25:00 2011-01-02 19:14:00 Esmana L~ Requ~
## 10        17 Create Pur~ 2011-01-02 18:32:00 2011-01-02 19:17:00 Anne Olw~ Requ~
## # ... with 395 more rows

Ordering by Start Date/Time

ordered <- filtered[order(as.POSIXct(filtered$`Start Time`), decreasing = FALSE),]
ordered
## # A tibble: 405 x 6
##    `Case ID` Activity    `Start Time`        `End Time`          Resource  Role 
##        <dbl> <chr>       <dttm>              <dttm>              <chr>     <chr>
##  1         1 Create Pur~ 2010-12-31 23:00:00 2010-12-31 23:37:00 Kim Passa Requ~
##  2         4 Create Pur~ 2011-01-01 07:39:00 2011-01-01 08:00:00 Fjodor K~ Requ~
##  3         5 Create Pur~ 2011-01-01 08:49:00 2011-01-01 09:35:00 Esmana L~ Requ~
##  4         7 Create Pur~ 2011-01-01 13:05:00 2011-01-01 14:00:00 Esmana L~ Requ~
##  5         8 Create Pur~ 2011-01-01 13:27:00 2011-01-01 14:17:00 Fjodor K~ Requ~
##  6        10 Create Pur~ 2011-01-02 01:52:00 2011-01-02 02:43:00 Esmana L~ Requ~
##  7        12 Create Pur~ 2011-01-02 04:31:00 2011-01-02 04:41:00 Alberto ~ Requ~
##  8        13 Create Pur~ 2011-01-02 06:47:00 2011-01-02 07:06:00 Anna Kau~ Requ~
##  9        16 Create Pur~ 2011-01-02 18:25:00 2011-01-02 19:14:00 Esmana L~ Requ~
## 10        17 Create Pur~ 2011-01-02 18:32:00 2011-01-02 19:17:00 Anne Olw~ Requ~
## # ... with 395 more rows

Computing Arrival Interval Between Cases/Instances

ordered <- data.table(ordered)
instances <- ordered[, Interval := difftime(as.POSIXct(ordered$`Start Time`), shift(as.POSIXct(ordered$`Start Time`), fill=ordered$`Start Time`[1L]), units="mins")]
instances <- instances[-c(1),]
instances
##      Case ID                    Activity          Start Time
##   1:       4 Create Purchase Requisition 2011-01-01 07:39:00
##   2:       5 Create Purchase Requisition 2011-01-01 08:49:00
##   3:       7 Create Purchase Requisition 2011-01-01 13:05:00
##   4:       8 Create Purchase Requisition 2011-01-01 13:27:00
##   5:      10 Create Purchase Requisition 2011-01-02 01:52:00
##  ---                                                        
## 400:    1917 Create Purchase Requisition 2011-10-08 20:07:00
## 401:    1920 Create Purchase Requisition 2011-10-09 03:59:00
## 402:    1929 Create Purchase Requisition 2011-10-09 22:27:00
## 403:    1938 Create Purchase Requisition 2011-10-11 13:48:00
## 404:    1949 Create Purchase Requisition 2011-10-13 05:27:00
##                 End Time         Resource      Role  Interval
##   1: 2011-01-01 08:00:00  Fjodor Kowalski Requester  519 mins
##   2: 2011-01-01 09:35:00  Esmana Liubiata Requester   70 mins
##   3: 2011-01-01 14:00:00  Esmana Liubiata Requester  256 mins
##   4: 2011-01-01 14:17:00  Fjodor Kowalski Requester   22 mins
##   5: 2011-01-02 02:43:00  Esmana Liubiata Requester  745 mins
##  ---                                                         
## 400: 2011-10-08 20:23:00       Miu Hanwan Requester 2247 mins
## 401: 2011-10-09 04:07:00 Penn Osterwalder Requester  472 mins
## 402: 2011-10-09 23:20:00     Elvira Lores Requester 1108 mins
## 403: 2011-10-11 14:08:00   Clement Duchot Requester 2361 mins
## 404: 2011-10-13 06:21:00      Tesca Lobes Requester 2379 mins
summary(as.numeric(instances$Interval))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     3.0   216.5   498.5  1016.7  1109.2 12248.0
sd(as.numeric(instances$Interval)) #Standard Deviation
## [1] 1540.984
var(as.numeric(instances$Interval)) #Variance
## [1] 2374630

Computing Activities Elapsed Time

dataset[['Elapsed Time']] <- as.difftime(difftime(dataset[['End Time']], dataset[['Start Time']], units="mins"))
model <- dataset
datasetActivities <- dataset
datasetActivities[,-c(1)][datasetActivities[,-c(1)]==0] <- NA
datasetActivities <- datasetActivities[complete.cases(datasetActivities),]
datasetActivities #[,c(1:6,7)] #Note: Viewing only some columns with changed order
## # A tibble: 5,363 x 7
##    `Case ID` Activity    `Start Time`        `End Time`          Resource  Role 
##        <dbl> <chr>       <dttm>              <dttm>              <chr>     <chr>
##  1         1 Create Pur~ 2010-12-31 23:00:00 2010-12-31 23:37:00 Kim Passa Requ~
##  2         1 Create Req~ 2011-01-01 04:37:00 2011-01-01 04:45:00 Kim Passa Requ~
##  3         1 Analyze Re~ 2011-01-01 05:41:00 2011-01-01 05:55:00 Karel de~ Purc~
##  4         1 Send Reque~ 2011-01-01 10:43:00 2011-01-01 11:09:00 Karel de~ Purc~
##  5         1 Create Quo~ 2011-01-01 11:32:00 2011-01-01 15:03:00 Magdalen~ Purc~
##  6         1 Analyze Qu~ 2011-01-01 21:44:00 2011-01-01 22:13:00 Immanuel~ Requ~
##  7         1 Settle con~ 2011-01-02 00:22:00 2011-01-02 08:20:00 Francois~ Purc~
##  8         1 Create Pur~ 2011-01-02 08:58:00 2011-01-02 09:10:00 Karel de~ Purc~
##  9         1 Confirm Pu~ 2011-01-02 13:09:00 2011-01-02 13:43:00 Sean Man~ Supp~
## 10         1 Deliver Go~ 2011-01-02 19:49:00 2011-01-03 02:37:00 Sean Man~ Supp~
## # ... with 5,353 more rows, and 1 more variable: Elapsed Time <drtn>
summary(as.numeric(datasetActivities$`Elapsed Time`))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     1.0     6.0    14.0   130.2    31.0  2944.0
sd(as.numeric(datasetActivities$`Elapsed Time`)) #Standard Deviation
## [1] 387.0091
var(as.numeric(datasetActivities$`Elapsed Time`)) #Variance
## [1] 149776

Computing Maximum and Minimum Hours of Work for Roles

datasetTemp <- dataset
datasetTemp[['Start Hours']] <- as.POSIXct(strftime(datasetTemp$`Start Time`, format="%H:%M:%S"), format = "%H:%M:%S")
datasetTemp[['End Hours']] <- as.POSIXct(strftime(datasetTemp$`End Time`, format="%H:%M:%S"), format = "%H:%M:%S")

labourHours <- datasetTemp %>%
  group_by(Role) %>%
  summarise(
    "Minimum Hour" = min(`Start Hours`, na.rm = T),
    "Maximum Hour" = max(`End Hours`, na.rm = T)
  ) %>%
  arrange(Role)

labourHours[['Min. Hour']] <- format(labourHours$`Minimum Hour`, "%H:%M:%S")
labourHours[['Max. Hour']] <- format(labourHours$`Maximum Hour`, "%H:%M:%S")
labourHours[,-c(2,3)]
## # A tibble: 5 x 3
##   Role              `Min. Hour` `Max. Hour`
##   <chr>             <chr>       <chr>      
## 1 Financial Manager 00:01:00    23:59:00   
## 2 Purchasing Agent  00:01:00    23:59:00   
## 3 Requester         00:00:00    23:56:00   
## 4 Requester Manager 00:00:00    23:59:00   
## 5 Supplier          00:02:00    23:59:00
#par(mfrow=c(1,2))
proportion <- table(dataset$Role)/nrow(dataset)

boxplot(datasetTemp$`Start Time` ~ datasetTemp$Role, width=proportion, ylab="", xlab="Roles", las=1, cex.axis = 0.5) 

vioplot(as.numeric(datasetTemp$`Start Time`) ~ datasetTemp$Role, ylab="", xlab="Roles", las=1, cex.axis = 0.5, col = palette[2], horizontal = FALSE)

boxplot(datasetTemp$`End Time` ~ datasetTemp$Role, width=proportion, ylab="", xlab="Roles", las=1, cex.axis = 0.5)

vioplot(as.numeric(datasetTemp$`End Time`) ~ datasetTemp$Role, ylab="", xlab="Roles", las=1, cex.axis = 0.5, col = palette[2], horizontal = FALSE)

Dataset Evaluation

Instances Arrival Interval

Statistics

instances.interval <- as.numeric(instances$Interval)
summary(instances.interval)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     3.0   216.5   498.5  1016.7  1109.2 12248.0
par(mfrow=c(2,2)) #Set a 2x2 matrix to plot 4 charts
hist(instances.interval, breaks = 20, main = "Histogram - Interval", xlab = "Interval")
hist(instances.interval, main = "Histogram - Interval (Zoom In)", breaks = 300, xlim = c(0,100), xlab = "Interval")
boxplot(instances.interval)
boxplot(instances.interval, ylim = c(0, 20)) #This is a scale reduced boxplot

Assess Distribution

descdist(instances.interval, discrete = FALSE)

## summary statistics
## ------
## min:  3   max:  12248 
## median:  498.5 
## mean:  1016.651 
## estimated sd:  1540.984 
## estimated skewness:  3.633647 
## estimated kurtosis:  19.84013

Fit/Compare the Distribution

# Distributions from "stats" package: norm,lnorm,exp,pois,cauchy,gamma,logis,nbinom,
# geom, beta,weibull
# Distributions from "actuar" package: invgamma,llogis,invweibull,pareto1,pareto
distribution <- fitdist(instances.interval, "norm")
plot(distribution)

Activities Elapsed Time

Statistics

activities.duration <- st(dataset, group = "Activity", vars=c("Elapsed Time"), group.long= TRUE, out = "return")
activities.duration
##                                                    Variable   N     Mean
## 1                      Activity: Amend Purchase Requisition             
## 2                                              Elapsed Time   6   28.167
## 3                                                                       
## 4           Activity: Amend Request for Quotation Requester             
## 5                                              Elapsed Time 355    9.859
## 6                                                                       
## 7   Activity: Amend Request for Quotation Requester Manager             
## 8                                              Elapsed Time  30     19.1
## 9                                                                       
## 10                   Activity: Analyze Purchase Requisition             
## 11                                             Elapsed Time 251    6.486
## 12                                                                      
## 13               Activity: Analyze Quotation comparison Map             
## 14                                             Elapsed Time 283   20.166
## 15                                                                      
## 16                  Activity: Analyze Request for Quotation             
## 17                                             Elapsed Time 748   23.112
## 18                                                                      
## 19             Activity: Approve Purchase Order for payment             
## 20                                             Elapsed Time 283        1
## 21                                                                      
## 22           Activity: Authorize Supplier's Invoice payment             
## 23                                             Elapsed Time 283        0
## 24                                                                      
## 25                             Activity: Choose best option             
## 26                                             Elapsed Time 283        0
## 27                                                                      
## 28                         Activity: Confirm Purchase Order             
## 29                                             Elapsed Time 283   20.198
## 30                                                                      
## 31                          Activity: Create Purchase Order             
## 32                                             Elapsed Time 283    9.622
## 33                                                                      
## 34                    Activity: Create Purchase Requisition             
## 35                                             Elapsed Time 405   30.896
## 36                                                                      
## 37                Activity: Create Quotation comparison Map             
## 38                                             Elapsed Time 283  204.576
## 39                                                                      
## 40         Activity: Create Request for Quotation Requester             
## 41                                             Elapsed Time 160      9.7
## 42                                                                      
## 43 Activity: Create Request for Quotation Requester Manager             
## 44                                             Elapsed Time 203     1.99
## 45                                                                      
## 46                         Activity: Deliver Goods Services             
## 47                                             Elapsed Time 283 1456.837
## 48                                                                      
## 49                                    Activity: Pay invoice             
## 50                                             Elapsed Time 283     9.29
## 51                                                                      
## 52                         Activity: Release Purchase Order             
## 53                                             Elapsed Time 305        1
## 54                                                                      
## 55                     Activity: Release Supplier's Invoice             
## 56                                             Elapsed Time 275    4.469
## 57                                                                      
## 58                                   Activity: Send invoice             
## 59                                             Elapsed Time 283        0
## 60                                                                      
## 61         Activity: Send Request for Quotation to Supplier             
## 62                                             Elapsed Time 283   23.155
## 63                                                                      
## 64                Activity: Settle conditions with supplier             
## 65                                             Elapsed Time 283  536.664
## 66                                                                      
## 67 Activity: Settle dispute with supplier Financial Manager             
## 68                                             Elapsed Time  60   23.233
## 69                                                                      
## 70  Activity: Settle dispute with supplier Purchasing Agent             
## 71                                             Elapsed Time  22  558.455
##    Std. Dev. Min Pctl. 25 Pctl. 75  Max
## 1                                      
## 2      3.971  23    25.25    31.75   32
## 3                                      
## 4                                      
## 5      2.978   5        7       13   15
## 6                                      
## 7                                      
## 8      4.887  12    15.25       24   27
## 9                                      
## 10                                     
## 11     3.977   4        5        7   65
## 12                                     
## 13                                     
## 14     7.955   6       14       27   34
## 15                                     
## 16                                     
## 17      8.51   0       18       29   50
## 18                                     
## 19                                     
## 20         0   1        1        1    1
## 21                                     
## 22                                     
## 23         0   0        0        0    0
## 24                                     
## 25                                     
## 26         0   0        0        0    0
## 27                                     
## 28                                     
## 29     9.998   4       13       28   94
## 30                                     
## 31                                     
## 32     2.151   6        8       12   13
## 33                                     
## 34                                     
## 35    15.207   5       17       45   57
## 36                                     
## 37                                     
## 38     90.55  38    136.5    279.5  365
## 39                                     
## 40                                     
## 41     2.298   4        8       11   16
## 42                                     
## 43                                     
## 44     0.704   1      1.5        2    3
## 45                                     
## 46                                     
## 47   796.874 183    776.5   2149.5 2944
## 48                                     
## 49                                     
## 50     3.078   4        7       12   15
## 51                                     
## 52                                     
## 53         0   1        1        1    1
## 54                                     
## 55                                     
## 56     1.461   2        3        6    7
## 57                                     
## 58                                     
## 59         0   0        0        0    0
## 60                                     
## 61                                     
## 62      7.83   1       18       27   88
## 63                                     
## 64                                     
## 65   190.877 238    365.5    710.5  879
## 66                                     
## 67                                     
## 68     6.573  13       17    29.25   34
## 69                                     
## 70                                     
## 71    24.861 523    540.5    567.5  620

Assess Distribution

activities <- unique(dataset$Activity) # Get distinct activities names
## 1 : Create Purchase Requisition | 2 : Create Request for Quotation Requester | 3 : Analyze Request for Quotation | 
## 4 : Send Request for Quotation to Supplier | 5 : Create Quotation comparison Map | 6 : Analyze Quotation comparison Map | 
## 7 : Choose best option | 8 : Settle conditions with supplier | 9 : Create Purchase Order | 
## 10 : Confirm Purchase Order | 11 : Deliver Goods Services | 12 : Release Purchase Order | 
## 13 : Approve Purchase Order for payment | 14 : Send invoice | 15 : Release Supplier's Invoice | 
## 16 : Authorize Supplier's Invoice payment | 17 : Pay invoice | 18 : Analyze Purchase Requisition | 
## 19 : Create Request for Quotation Requester Manager | 20 : Amend Request for Quotation Requester | 21 : Settle dispute with supplier Financial Manager | 
## 22 : Amend Purchase Requisition | 23 : Settle dispute with supplier Purchasing Agent | 24 : Amend Request for Quotation Requester Manager |
uniqueActivities = data.frame(ID=character(), Activity=character(), Value=integer())
#colnames(uniformActivities) <- c("ID", "Name", "Value")
for(i in 1:length(activities)) {
  activity <- filter(dataset, Activity == activities[i])
  if ( length(unique(activity$`Elapsed Time`)) == 1) { uniqueActivities <- rbind(uniqueActivities, data.frame(ID=i, Activity=activities[i],Value=unique(activity$`Elapsed Time`)));  cat("\n", "Activity - ",i," : " ,activities[i],"with uniform value of : ", unique(activity$`Elapsed Time`),"\n"); next; }
  descdist(as.numeric(activity$`Elapsed Time`), discrete = FALSE, graph = TRUE)
  cat("\n", "Activity - ",i," : " , activities[i], "\n")
}

## 
##  Activity -  1  :  Create Purchase Requisition

## 
##  Activity -  2  :  Create Request for Quotation Requester

## 
##  Activity -  3  :  Analyze Request for Quotation

## 
##  Activity -  4  :  Send Request for Quotation to Supplier

## 
##  Activity -  5  :  Create Quotation comparison Map

## 
##  Activity -  6  :  Analyze Quotation comparison Map 
## 
##  Activity -  7  :  Choose best option with uniform value of :  0

## 
##  Activity -  8  :  Settle conditions with supplier

## 
##  Activity -  9  :  Create Purchase Order

## 
##  Activity -  10  :  Confirm Purchase Order

## 
##  Activity -  11  :  Deliver Goods Services 
## 
##  Activity -  12  :  Release Purchase Order with uniform value of :  1 
## 
##  Activity -  13  :  Approve Purchase Order for payment with uniform value of :  1 
## 
##  Activity -  14  :  Send invoice with uniform value of :  0

## 
##  Activity -  15  :  Release Supplier's Invoice 
## 
##  Activity -  16  :  Authorize Supplier's Invoice payment with uniform value of :  0

## 
##  Activity -  17  :  Pay invoice

## 
##  Activity -  18  :  Analyze Purchase Requisition

## 
##  Activity -  19  :  Create Request for Quotation Requester Manager

## 
##  Activity -  20  :  Amend Request for Quotation Requester

## 
##  Activity -  21  :  Settle dispute with supplier Financial Manager

## 
##  Activity -  22  :  Amend Purchase Requisition

## 
##  Activity -  23  :  Settle dispute with supplier Purchasing Agent

## 
##  Activity -  24  :  Amend Request for Quotation Requester Manager

Activities with Unique Values

uniqueActivities
##   ID                             Activity Value
## 1  7                   Choose best option     0
## 2 12               Release Purchase Order     1
## 3 13   Approve Purchase Order for payment     1
## 4 14                         Send invoice     0
## 5 16 Authorize Supplier's Invoice payment     0

Fit/Compare the Distribution

## 
##  Activity -  Create Purchase Requisition
# Distributions from "stats" package: norm,lnorm,exp,pois,cauchy,gamma,logis,nbinom,
# geom,beta,weibull
# Distributions from "actuar" package: invgamma,llogis,invweibull,pareto1,pareto
# The potential distribution was obtained in previous step. eg: norm, exp, etc
# Repeat below 3 lines per each activity name/index trying a corresponding distribution
activity <- filter(dataset, Activity == activities[1])  # Activity index 1
distribution <- fitdist(as.numeric(activity$`Elapsed Time`), "exp")
plot(distribution)

## 
##  Activity -  Create Request for Quotation Requester
# Distributions from "stats" package: norm,lnorm,exp,pois,cauchy,gamma,logis,nbinom,
# geom,beta,weibull
# Distributions from "actuar" package: invgamma,llogis,invweibull,pareto1,pareto
# The potential distribution was obtained in previous step. eg: norm, exp, etc
# Repeat below 3 lines per each activity name/index trying a corresponding distribution
activity <- filter(dataset, Activity == activities[4]) # Activity index 4
distribution <- fitdist(as.numeric(activity$`Elapsed Time`), "norm")
plot(distribution)

Appendix A

Probability Distributions (Examples)

Normal Distribution

set.seed(1) 
par(mfrow=plot.matrix) 
sample.dataset <- rnorm(observations, mean = 0, sd = 1)
summary(sample.dataset)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## -3.671300 -0.669355 -0.015493 -0.003188  0.697524  3.810277
hist(sample.dataset, main = "Histogram (Frequency)", breaks = bins.break, col = palette[1])
hist(sample.dataset, main = "Histogram (Density)", breaks = bins.break, col = palette[2], freq = FALSE)
lines(density(sample.dataset), lw = line.width, col = palette[3])
vioplot(sample.dataset, col = palette[2], horizontal = TRUE)
plot(density(sample.dataset), type="n", main ="")
polygon(density(sample.dataset), col=palette[4], border=palette[3])
rug(sample.dataset, col=palette[1])

Exponential Distribution

set.seed(1) 
par(mfrow=plot.matrix) 
sample.dataset <- rexp(observations, rate = 1)
summary(sample.dataset)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## 0.000473 0.285721 0.701099 1.012070 1.379185 9.184451
hist(sample.dataset, main = "Histogram (Frequency)", breaks = bins.break, col = palette[1])
hist(sample.dataset, main = "Histogram (Density)", breaks = bins.break, col = palette[2], freq = FALSE)
lines(density(sample.dataset), lw = line.width, col = palette[3])
vioplot(sample.dataset, col = palette[2], horizontal = TRUE)
plot(density(sample.dataset), type="n", main ="")
polygon(density(sample.dataset), col=palette[4], border=palette[3])
rug(sample.dataset, col=palette[1])

Chi-Square Distribution

set.seed(1) 
par(mfrow=plot.matrix) 
sample.dataset <- rchisq(observations, df = 5)
summary(sample.dataset)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.126   2.688   4.354   5.033   6.738  23.181
hist(sample.dataset, main = "Histogram (Frequency)", breaks = bins.break, col = palette[1])
hist(sample.dataset, main = "Histogram (Density)", breaks = bins.break, col = palette[2], freq = FALSE)
lines(density(sample.dataset), lw = line.width, col = palette[3])
vioplot(sample.dataset, col = palette[2], horizontal = TRUE)
plot(density(sample.dataset), type="n", main ="")
polygon(density(sample.dataset), col=palette[4], border=palette[3])
rug(sample.dataset, col=palette[1])

Logistic Distribution

set.seed(1) 
par(mfrow=plot.matrix) 
sample.dataset <- rlogis(observations)
summary(sample.dataset)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -8.51509 -1.13675 -0.04549 -0.01524  1.16167  9.57546
hist(sample.dataset, main = "Histogram (Frequency)", breaks = bins.break, col = palette[1])
hist(sample.dataset, main = "Histogram (Density)", breaks = bins.break, col = palette[2], freq = FALSE)
lines(density(sample.dataset), lw = line.width, col = palette[3])
vioplot(sample.dataset, col = palette[2], horizontal = TRUE)
plot(density(sample.dataset), type="n", main ="")
polygon(density(sample.dataset), col=palette[4], border=palette[3])
rug(sample.dataset, col=palette[1])

Poisson Distribution

set.seed(1) 
par(mfrow=plot.matrix) 
sample.dataset <- rpois(observations, lambda = 15)
summary(sample.dataset)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    3.00   12.00   15.00   15.03   18.00   35.00
hist(sample.dataset, main = "Histogram (Frequency)", breaks = bins.break, col = palette[1])
hist(sample.dataset, main = "Histogram (Density)", breaks = bins.break, col = palette[2], freq = FALSE)
lines(density(sample.dataset), lw = line.width, col = palette[3])
vioplot(sample.dataset, col = palette[2], horizontal = TRUE)
plot(density(sample.dataset), type="n", main ="")
polygon(density(sample.dataset), col=palette[4], border=palette[3])
rug(sample.dataset, col=palette[1])

t-Student Distribution

set.seed(1) 
par(mfrow=plot.matrix) 
sample.dataset <- rt(observations, df = 10)
summary(sample.dataset)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -4.89708 -0.68148  0.01846  0.02314  0.71075  5.43763
hist(sample.dataset, main = "Histogram (Frequency)", breaks = bins.break, col = palette[1])
hist(sample.dataset, main = "Histogram (Density)", breaks = bins.break, col = palette[2], freq = FALSE)
lines(density(sample.dataset), lw = line.width, col = palette[3])
vioplot(sample.dataset, col = palette[2], horizontal = TRUE)
plot(density(sample.dataset), type="n", main ="")
polygon(density(sample.dataset), col=palette[4], border=palette[3])
rug(sample.dataset, col=palette[1])

Viewing the Process Model

include.in.render <- TRUE # Change this to FALSE to export to pdf (Knit to Pdf)
events <- model %>% #a data.frame with the information in the table above
    mutate(Status = "complete",
           Activity_Instance = 1:nrow(.)) %>%
    eventlog(
        case_id = "Case ID",
        activity_id = "Activity",
        activity_instance_id = "Activity_Instance",
        lifecycle_id = "Status",
        timestamp = "Start Time",
        resource_id = "Resource"
    )
events %>% process_map(type = frequency("relative"), layout = layout_pm(fixed_positions = TRUE))
events %>% process_map(performance(mean, "hours"))
events %>%  precedence_matrix(type = "absolute")
## # A tibble: 35 x 3
##    antecedent                                     consequent                   n
##    <fct>                                          <fct>                    <int>
##  1 Amend Purchase Requisition                     Create Request for Quot~     1
##  2 Analyze Purchase Requisition                   Amend Purchase Requisit~     6
##  3 Amend Purchase Requisition                     Analyze Purchase Requis~     5
##  4 Release Purchase Order                         Settle dispute with sup~    22
##  5 Amend Request for Quotation Requester Manager  Analyze Request for Quo~    30
##  6 Analyze Request for Quotation                  Amend Request for Quota~   355
##  7 Analyze Purchase Requisition                   Create Request for Quot~   203
##  8 Settle dispute with supplier Financial Manager Authorize Supplier's In~    60
##  9 Release Supplier's Invoice                     Settle dispute with sup~    60
## 10 Analyze Request for Quotation                  Amend Request for Quota~    30
## # ... with 25 more rows
events %>%  precedence_matrix(type = "absolute") %>% plot

#events %>% resource_map()
animate_process(events, mode = "relative", jitter = 10, legend = "color",
                mapping = token_aes(size = token_scale(3), color = token_scale("Credit Request Cases/Instances", scale = "ordinal", 
                range = RColorBrewer::brewer.pal(12, "Paired"))))